package com.empresa.piloto01.pessoa.dao;

import java.util.HashMap;
import java.util.List;

import org.springframework.jdbc.core.simple.SimpleJdbcInsert;
import org.springframework.stereotype.Repository;

import com.empresa.piloto01.JdbcDaoSupport;
import com.empresa.piloto01.pessoa.entity.Pessoa;

@Repository
public class PessoaDaoImpl extends JdbcDaoSupport implements PessoaDao {

	@Override
	public Pessoa save(Pessoa e) {

		HashMap<String, Object> args = new HashMap<String, Object>();
		args.put("cpf", e.getCpf());
		args.put("data_nascimento", e.getDataNascimento());
		args.put("email", e.getEmail());
		args.put("nome", e.getNome());

		e.setId(new SimpleJdbcInsert(getJdbcTemplate().getDataSource())
				.withTableName("pessoa").usingGeneratedKeyColumns("id")
				.executeAndReturnKey(args).longValue());
		return e;
	}

	@Override
	public void delete(Long id) {
		String sql = "delete from pessoa where id = ?";
		getJdbcTemplate().update(sql, id);
	}

	@Override
	public Pessoa findById(Long id) {
		String sql = "select * from pessoa left join tipo_pessoa using(id) where pessoa.id = ?";
		Object args[] = { id };
		return getJdbcTemplate().queryForObject(sql, args,
				new PessoaRowMapper());
	}

	@Override
	public List<Pessoa> findAll(int limit, int offset) {
		String sql = "select * from pessoa left join tipo_pessoa on pessoa.tipo_pessoa_fk = tipo_pessoa.id order by lower(nome) limit ? offset ?";
		Object args[] = { limit, offset };
		return getJdbcTemplate().query(sql, args, new PessoaRowMapper());
	}

	@Override
	public void update(Pessoa e) {
		Object[] args = { e.getCpf(), e.getDataNascimento(), e.getEmail(),
				e.getNome(), e.getTipoPessoa().getId(), e.getId() };

		String sql = "update pessoa set cpf = ?, data_nascimento = ?, email = ?, tipo_pessoa = ? where id = ?";
		getJdbcTemplate().update(sql, args);
	}

	@Override
	public int count() {
		String sql = "select count(id) from pessoa";
		return getJdbcTemplate().queryForInt(sql);
	}

}
